/*
 * GYAsyncCmd.h
 *
 *  Created on: 2015年9月22日
 *      Author: gaoyi
 */

#ifndef GYASYNCCMD_H_
#define GYASYNCCMD_H_

#include <stddef.h>
#include "object/GYObject.h"

/**
* 异步命令基类
*/
class GYAsyncCmd : public GYObject
{
protected:
	GYAsyncCmd();

	virtual	~GYAsyncCmd();
public:
	GYAsyncCmd*					GetParent() { return m_pstParent; }
	const GYAsyncCmd*			GetParent() const { return m_pstParent; }
	GYAsyncCmd*					GetChild() { return m_pstParent; }
	const GYAsyncCmd*			GetChild() const { return m_pstParent; }

	void						SetParent(GYAsyncCmd* p) { m_pstParent = p; }
	void						SetChild(GYAsyncCmd* p) { m_pstChild = p; }
public:
	int							GetCmdId() const { return m_iCmdId; }
	int							GetCmdSeq() const { return m_iCmdSeq; }

	void						SetCmdId(int cmdId) { m_iCmdId = cmdId; }
	void						SetCmdSeq(int cmdSeq) { m_iCmdSeq = cmdSeq; }

	bool						GetParentEnableLogicDo() const { return m_bParentEnableLogicDo; }

	void						SetParentEnableLogicDo(bool p) { m_bParentEnableLogicDo = p; }
public:
    /**
    * 在调用子命令Do之前先RegChild
    */
	void						RegisterChild(GYAsyncCmd *pstChild, bool bParentEnableLogicDo = false);
public:
    /**
    * 生成命令后执行Do函数.
    * @param[in] pData 用void*做参数, 以不变应万变
    */
    virtual int 						Do(void* pData);

    /**
    * 如果没有子命令, 外部收到响应后调用命令的OnAnswer函数
    * @param[in] pData 用void*做参数, 以不变应万变
    */
    virtual int 						OnAnswer(void* pData);

    /**
    * 该命令用于自定义子命令返回处理函数
    * @param[in] iRet 子命令执行的返回值
    */
    virtual int 						LogicDo(int iRet);
public:
    /**
    * 如果有子命令, 子命令执行完毕后调用父命令的CallBack函数
    * @param[in] iRet 子命令执行的返回值 默认回调函数是执行Done
    */
    virtual int 						CallBack(int iRet);
    /**
    * 命令执行完毕后调用Done函数, 以便自动释放或回调父命令
    */
	virtual int							Done(int iRet);
private:
	GYAsyncCmd*					m_pstParent;
	GYAsyncCmd*					m_pstChild;
private:
	int							m_iCmdId;
	int							m_iCmdSeq;
private:
	bool						m_bParentEnableLogicDo;
};

#endif /* GYASYNCCMD_H_ */
